## 视频转GIF
import cv2
from PIL import Image


def video_to_gif(video_path, gif_path, fps=10, resize_factor=0.5, quality=75):
    """
    将视频转换为GIF，支持设置帧率、尺寸缩放和质量。

    :param video_path: 输入视频路径
    :param gif_path: 输出GIF路径
    :param fps: 每秒帧数
    :param resize_factor: 尺寸缩放比例（0~1之间），默认为0.5
    :param quality: GIF的质量，范围1~100，数值越低清晰度越低，默认为75
    """
    # 打开视频文件
    cap = cv2.VideoCapture(video_path)

    # 获取视频的总帧数和帧率
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    video_fps = cap.get(cv2.CAP_PROP_FPS)

    # 计算帧提取间隔
    interval = round(video_fps / fps)

    # 用于存储帧
    frames = []
    frame_idx = 0

    while True:
        ret, frame = cap.read()
        if not ret:
            break

        # 每隔一定帧提取一帧
        if frame_idx % interval == 0:
            # 调整尺寸
            if 0 < resize_factor < 1:
                frame = cv2.resize(
                    frame,
                    None,
                    fx=resize_factor,
                    fy=resize_factor,
                    interpolation=cv2.INTER_AREA,
                )

            # 转换为RGB格式（Pillow需要）
            frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

            # 转为Pillow图像并加入帧列表
            pil_img = Image.fromarray(frame_rgb)
            frames.append(pil_img)

        frame_idx += 1

    # 释放视频文件
    cap.release()

    # 将帧保存为GIF
    frames[0].save(
        gif_path,
        save_all=True,
        append_images=frames[1:],
        loop=0,
        duration=1000 / fps,
        quality=quality,
    )
    print(f"GIF已保存为 {gif_path}")


# 调用函数进行转换
video_path = r"D:\研究生\科研相关\比赛\多维度无人化海上巡逻系统\国赛报名-智慧城市\演示图片\GIF\无人机自主降落-第一视角.mp4"  # 替换为你的视频文件路径
gif_path = r"D:\研究生\科研相关\比赛\多维度无人化海上巡逻系统\国赛报名-智慧城市\演示图片\GIF\无人机自主降落-第一视角.gif"  # 设置输出的GIF文件路径
fps = 8  # 每秒帧数
resize_factor = 0.2  # 尺寸缩放比例，0.5表示缩小到50%
quality = 10  # GIF清晰度，值越低文件越小，默认75

video_to_gif(video_path, gif_path, fps, resize_factor, quality)
